/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hj4;

/**
 *
 * ALGORITMOS Y ESTRUCTURA DE DATOS
 * SECCION 10
 * CATEDRATICO ING. ROBLES FLORES
 * HOJA DE TRABAJO 4
 *  
 * YUCELY BEB     12537
 * MARCOS LOPEZ    12519
 * VICTOR FUENTES 12298
 * 
 */
public class ListaDoble implements iPila {
    protected int count;
    protected NodoListaDoble cabeza;
    protected NodoListaDoble cola;
    
    public ListaDoble(){
        count=0;
        cabeza=null;
        cola=null;
    }
    
    public void addfFirst(String v){
        cabeza=new NodoListaDoble(v,cabeza,null);
        if(cola==null){
            cola=cabeza;
            
        }
        count++;
    }
    
    public void push(String v){
        cola=new NodoListaDoble(v, null, cola);
        //if(cabeza==null){
          //  cabeza=cola;
        //}
        count++;
    }
    //metodo para imprimir la lista doblemente enlazada
    public String imprimir(){
        String str="";
        
        return str;
    }
    
    
    //metodo para limpiar la lsita
    public void limpiar(){
        cabeza=null;
        count=0;
        cola=null;
    }
    public String pop(){
        if(!isEmpty()){
            //System.out.println("Lista no vacia");
        }
        
        NodoListaDoble temp=cola;
        cola=cola.previous();
        if(cola==null){
            cabeza=null;
        }else{
            cola.SetPuntero(null);
        }
        count--;
        return temp.getValor();
    }
    
    public boolean isEmpty(){
        if (count==0) return true;
        else return false;
    }
    
    //quita elemento de la lista que se ingresa como parametro
    public String remove(String v){
        NodoListaDoble finger=cabeza;
        while(finger!=null && !finger.getValor().equals(v)){
            finger=finger.Siguiente();
        }
        if(finger!=null){
            //arreglo del puntero next del  nodo anterioro
            if(finger.previous()!=null){
                finger.previous().SetPuntero(finger.Siguiente());
            }else{
                cabeza=finger.Siguiente();
            }
            //arreglo del puntero next del nodo siguiente
            if(finger.Siguiente()!=null){
                finger.Siguiente().SetPunteroAnterior(finger.previous());
            }else{
                cola=finger.previous();
            }
                count--;
                return finger.getValor();
               
                
        }
        return null;
    }
    
    public int lastIndexOf(String v){
        int i=getTamano()-1;
        NodoListaDoble finger=cola;
        while(finger!=null && !finger.getValor().equals(v)){
            finger=finger.previous();
            i--;
        }
        if(finger==null){
            return -1;
        }else{
            return i;
        }
    }
    
    
    public int getTamano(){
        return count;
    }
    public void setTamano(int i){
        count=i;
    }
}
